{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lb5yiH5h8x3h"
      },
      "source": [
        "##### Copyright 2025 Google LLC."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "906e07f6e562"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WMGdicu8PVD9"
      },
      "source": [
        "# Use Gemini thinking"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DR4Ti6Q0QKIl"
      },
      "source": [
        "<a target=\"_blank\" href=\"https://colab.research.google.com/github/google-gemini/cookbook/blob/main/quickstarts/Get_started_thinking_REST.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" height=30/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ZRv2aZIvJKuT"
      },
      "source": [
        "---\n",
        "> **Gemini 3 Pro**: If you are only interested in the new [Gemini 3 Pro](https://ai.google.dev/gemini-api/docs/models#gemini-3-pro) new thinking levels, jump directly to the [dedicated section](#gemini3) at the end of this notebook that also includes a [migration guide](#migrtion).\n",
        "\n",
        "---\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3w14yjWnPVD-"
      },
      "source": [
        "All Gemini models from the 2.5 generation and the new [Gemini 3 Pro](https://ai.google.dev/gemini-api/docs/models#gemini-3-pro) are trained to do a [thinking process](https://ai.google.dev/gemini-api/docs/thinking-mode) (or reasoning) before getting to a final answer. As a result,\n",
        "those models are capable of stronger reasoning capabilities in its responses than previous models.\n",
        "\n",
        "You'll see examples of those reasoning capabilities with [brain teasers](#brain), [geometry](#geometry) and [math](#math) problems.\n",
        "\n",
        "As you will see, the model is exposing its thoughts so you can have a look at its reasoning and how it did reach its conclusions."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FHsG7Z-t1AoP"
      },
      "source": [
        "## Understanding the thinking models\n",
        "\n",
        "Thinking models are optimized for complex tasks that need multiple rounds of strategyzing and iteratively solving.\n",
        "\n",
        "When making REST API calls, you control the thinking behavior by including a thinkingConfig object within the generationConfig in your JSON request payload.\n",
        "\n",
        "[Gemini 2.5 Flash](https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview-04-17) in particular, brings the flexibility of using `thinkingBudget` - a parameter\n",
        "that offers fine-grained control over the maximum number of tokens a model can generate while thinking. Alternatively, you can designate a precise token allowance for the\n",
        "\"thinking\" stage through the adjusment of the `thinkingBudget` parameter. This allowance can vary between 0 and 24576 tokens for 2.5 Flash.\n",
        "\n",
        "For more information about all Gemini models, check the [documentation](https://ai.google.dev/gemini-api/docs/models/gemini) for extended information on each of them.\n",
        "\n",
        "On this notebook most examples are using the `thinkingBudget` parameter since it's compatible with both the 2.5 and the 3 generations of models. For more information about using the `thinkingBudget` with the Gemini thinking model, check the [documentation](https://ai.google.dev/gemini-api/docs/thinking).\n",
        "\n",
        "**NEW: thinking levels:** [Gemini 3 Pro](https://ai.google.dev/gemini-api/docs/models#gemini-3-pro) introduced a new, easier way to manage the thinking buget by setting a `thinkingLevel` that is documented in the [section of this guide dedicated to Gemini 3](#gemini3)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "aDUGen_kQYq2"
      },
      "source": [
        "### Setup your API key\n",
        "\n",
        "To run the following cell, your API key must be stored it in a Colab Secret named `GOOGLE_API_KEY`. If you don't already have an API key, or you're not sure how to create a Colab Secret, see [Authentication ![image](https://storage.googleapis.com/generativeai-downloads/images/colab_icon16.png)](../quickstarts/Authentication.ipynb) for an example."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "0H_lRdlrQYq3"
      },
      "outputs": [],
      "source": [
        "from google.colab import userdata\n",
        "\n",
        "GOOGLE_API_KEY=userdata.get('GOOGLE_API_KEY')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "h41dkA8mX6v7"
      },
      "outputs": [],
      "source": [
        "import json\n",
        "import requests\n",
        "\n",
        "MODEL_ID = \"gemini-2.5-flash\" # @param [\"gemini-2.5-flash-lite\", \"gemini-2.5-flash\", \"gemini-2.5-pro\", \"gemini-3-pro-preview\"] {\"allow-input\":true, isTemplate: true}\n",
        "url = f\"https://generativelanguage.googleapis.com/v1beta/models/{MODEL_ID}:generateContent?key={GOOGLE_API_KEY}\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qAPiYdYMfeJP"
      },
      "source": [
        "# Examples\n",
        "\n",
        "Here are some quite complex examples of what Gemini **thinking** model can solve.\n",
        "\n",
        "In each of them you can select different models to see how this new model compares to its predecesors.\n",
        "\n",
        "In some cases, you'll still get the good answer from the other models, in that case, re-run it a couple of times and you'll see that Gemini 2.5 thinking is more consistent thanks to its thinking step."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1987d241366e"
      },
      "source": [
        "## Example #1: Brain Teaser with Thinking\n",
        "\n",
        "You can start by asking the model to explain a concept and see how it does reasoning before answering.\n",
        "\n",
        "Starting with the adaptive `thinkingBudget` - which is the default when you don't specify a budget - the model will dynamically adjust the budget based on the complexity of the request.\n",
        "\n",
        "`includeThoughts` tells the model to include its thoughts in the output."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ffa2fd81d26e"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "THOUGHTS:\n",
            "**Here's how I'm thinking about this:**\n",
            "\n",
            "Okay, so we've got an aquatic mammal, freshwater, smaller than a cat. My mind immediately starts running through the usual suspects. I'm going through the marine mammals first, ruling them out: whales, dolphins, sea lions... nope, definitely not. Manatees and dugongs, too big. Then, I start on the freshwater side. Otters are a possibility, though some are much bigger. Beavers? Too big. Muskrat and Mink are looking promising, and I'm adding platypus because it's aquatic and I need to be inclusive. Water voles, various shrews, and a quick check on the hippo (nope, obviously).\n",
            "\n",
            "Now, refining based on size, the really strong candidates emerge: the water shrew and vole are ideal. The platypus, being unique, is a great fit. Mink also look good. Muskrat... borderline but possible. I'll include it to show I thought it through.\n",
            "\n",
            "Based on the information, I'll go with the Water Shrew, Water Vole, Platypus, and Mink, as distinct options. They cover the space and show I've done a proper job.\n",
            "\n",
            "Now, how would I confirm this? I start formulating those 20-questions style questions. The Platypus gets a special question: \"Does it lay eggs?\" because it's the most unusual. I'd ask a yes/no question to differentiate the different candidates and confirm the key features.  I want to narrow down the options with each question, so I'm thinking about webbed feet, tail type, habitat, and overall size. I need to design the best strategy with the fewest questions.\n",
            "\n",
            "\n",
            "OUTPUT:\n",
            "This is a fun one! Let's break down the clues:\n",
            "\n",
            "1.  **Aquatic mammal:** Lives in or around water, has fur, breathes air, nurses young.\n",
            "2.  **Doesn't live in the sea:** Exclusively freshwater (rivers, lakes, ponds, swamps).\n",
            "3.  **Smaller than a cat:** A domestic cat is generally 8-10 lbs (3.6-4.5 kg) and about 18-24 inches (45-60 cm) long including the tail.\n",
            "\n",
            "Given these clues, here are a few strong possibilities:\n",
            "\n",
            "---\n",
            "\n",
            "### What could that be?\n",
            "\n",
            "1.  **Water Shrew:**\n",
            "    *   **Fits:** These are very small (much smaller than a cat, often only a few inches long), highly aquatic (excellent swimmers and divers), feed on aquatic insects and small fish, and live in freshwater habitats across many continents.\n",
            "\n",
            "2.  **Water Vole:**\n",
            "    *   **Fits:** Roughly the size of a large rat (smaller than most cats), strong swimmers, live in freshwater rivers, streams, and ponds, primarily herbivorous but will eat insects. Common in Europe and parts of Asia.\n",
            "\n",
            "3.  **Platypus:**\n",
            "    *   **Fits:** Unique semi-aquatic mammal (monotreme, meaning it lays eggs), found exclusively in eastern Australia (freshwater rivers and lakes), and is smaller than a cat (typically 12-15 inches/30-38 cm long, not including the tail).\n",
            "\n",
            "4.  **Mink:**\n",
            "    *   **Fits:** A semi-aquatic weasel, smaller than a cat (body length usually 12-18 inches/30-45 cm), excellent swimmers and hunters of fish, frogs, and other small prey in freshwater environments.\n",
            "\n",
            "---\n",
            "\n",
            "### How could you make sure? (20 Questions style - Yes/No answers)\n",
            "\n",
            "To narrow it down and confirm, you'd ask questions that target the specific characteristics of these animals:\n",
            "\n",
            "1.  **Is it native to Australia?** (Yes = Platypus)\n",
            "    *   *If yes, you've likely found it. If no, proceed...*\n",
            "\n",
            "2.  **Does it have webbed feet?** (Yes = Platypus, Water Shrew, Mink (partially), some Water Voles have fringed feet)\n",
            "    *   *This helps rule out things like land mammals that just drink from water.*\n",
            "\n",
            "3.  **Does it belong to the rodent family?** (Yes = Water Vole, Muskrat - if considering muskrat)\n",
            "    *   *This would rule out shrews, minks, and platypus.*\n",
            "\n",
            "4.  **Is its diet primarily insects and small invertebrates?** (Yes = Water Shrew, Platypus to some extent)\n",
            "    *   *This would lean away from the more herbivorous water vole or the more generalist mink.*\n",
            "\n",
            "5.  **Does it have a long, pointed snout with whiskers?** (Yes = Water Shrew)\n",
            "    *   *Distinctive feature of shrews.*\n",
            "\n",
            "6.  **Does it have a short, blunt snout and round ears almost hidden in its fur?** (Yes = Water Vole)\n",
            "    *   *Distinguishes it from shrews and minks.*\n",
            "\n",
            "7.  **Is it known for being a skilled hunter of fish and frogs?** (Yes = Mink, Water Shrew)\n",
            "    *   *Mink are formidable predators.*\n",
            "\n",
            "8.  **Is its body typically less than 6 inches (15 cm) long (excluding the tail)?** (Yes = Water Shrew)\n",
            "    *   *This is a size check that firmly places it as very small.*\n",
            "\n",
            "9.  **Does it belong to the weasel family?** (Yes = Mink)\n",
            "    *   *A direct family identification.*\n",
            "\n",
            "10. **Is it active year-round, even in freezing conditions?** (Many of these are, but can be a differentiator for specific species behavior).\n",
            "\n",
            "11. **Does it spend a significant amount of time burrowing in riverbanks?** (Yes = Water Vole, Platypus, Mink (for dens))\n",
            "\n",
            "12. **Is it generally considered solitary?** (Many small aquatic mammals are).\n",
            "\n",
            "By asking these types of questions, you'd quickly narrow down whether it's a water shrew, water vole, platypus, or mink, or another similar small freshwater aquatic mammal.\n"
          ]
        }
      ],
      "source": [
        "prompt = \"\"\"\n",
        "    You are playing the 20 question game. You know that what you are looking for\n",
        "    is a aquatic mammal that doesn't live in the sea, and that's smaller than a\n",
        "    cat. What could that be and how could you make sure?\n",
        "\"\"\"\n",
        "# The animal I'm thinking of is a platipus\n",
        "\n",
        "data = {\n",
        "    \"contents\": [\n",
        "        {\n",
        "            \"parts\": [\n",
        "                {\"text\": prompt}\n",
        "            ]\n",
        "        }\n",
        "    ],\n",
        "    \"generationConfig\": {\n",
        "          \"thinkingConfig\": {\n",
        "              \"includeThoughts\": True,\n",
        "          }\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(\n",
        "   url,\n",
        "   headers={'Content-Type': 'application/json'},\n",
        "   data=json.dumps(data)\n",
        ").json()\n",
        "\n",
        "print(\"THOUGHTS:\")\n",
        "print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "print()\n",
        "print(\"OUTPUT:\")\n",
        "print(response['candidates'][0]['content']['parts'][1]['text'])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "BMrpEUYDC0U1"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "{'error': {'code': 400, 'message': 'Invalid JSON payload received. Unknown name \"includeThoughts\" at \\'generation_config\\': Cannot find field.', 'status': 'INVALID_ARGUMENT', 'details': [{'@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': [{'field': 'generation_config', 'description': 'Invalid JSON payload received. Unknown name \"includeThoughts\" at \\'generation_config\\': Cannot find field.'}]}]}}\n"
          ]
        }
      ],
      "source": [
        "print(response)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cf57b6797848"
      },
      "source": [
        "Inspecting the Response Metadata: After making the REST call, the response JSON contains usageMetadata. This object provides information about the token counts for the request. Look for the `thoughtsTokenCount` field within usageMetadata to see how many tokens were consumed by the thinking process for this request. You'll also see `promptTokenCount`, `candidatesTokenCount` (for the final output), and `totalTokenCount`. As you can see here, the model used a significant number of tokens in the thinking steps."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6d09a98f06e6"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Prompt tokens: 58\n",
            "Thoughts tokens: 1477\n",
            "Output tokens: 820\n",
            "Total tokens: 2355\n"
          ]
        }
      ],
      "source": [
        "print(\"Prompt tokens:\",response[\"usageMetadata\"][\"promptTokenCount\"])\n",
        "print(\"Thoughts tokens:\",response[\"usageMetadata\"][\"thoughtsTokenCount\"])\n",
        "print(\"Output tokens:\", response[\"usageMetadata\"][\"candidatesTokenCount\"])\n",
        "print(\"Total tokens:\", response[\"usageMetadata\"][\"totalTokenCount\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5aecf74aff72"
      },
      "source": [
        "### Disabling the thinking steps\n",
        "\n",
        "You can explicitly disable the thinking steps by including the `thinkingConfig` object in the `generationConfig` and setting the `thinkingBudget` parameter to `0` in the JSON payload. This tells the model not to perform any internal reasoning steps before generating the final output. You'll likely see that in this case, the model doesn't think of the platypus as a possible answer.\n",
        "\n",
        "Note that you can't disable thinking on pro models."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "602bf11f5b78"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "This is a fun challenge! Let's break it down.\n",
            "\n",
            "**The Object:** A aquatic mammal that doesn't live in the sea, and that's smaller than a cat.\n",
            "\n",
            "**Possible Candidate:** The most likely candidate that fits all those criteria is a **river otter pup**.\n",
            "\n",
            "**Why a River Otter Pup?**\n",
            "\n",
            "*   **Aquatic Mammal:** Yes, otters are well-known aquatic mammals.\n",
            "*   **Doesn't Live in the Sea:** While some otters live in coastal areas, river otters specifically inhabit freshwater environments like rivers, lakes, and marshes.\n",
            "*   **Smaller than a Cat:** An adult river otter is definitely larger than a cat. However, a newborn or very young **pup** (baby otter) would be significantly smaller than a domestic cat. They are born blind and helpless, and quite tiny.\n",
            "\n",
            "**How to Make Sure (Your 20 Questions Strategy):**\n",
            "\n",
            "To confirm this, you'd use your 20 questions to narrow down the possibilities. Here's a possible line of questioning, aiming to eliminate other options and pinpoint the river otter pup:\n",
            "\n",
            "1.  **Is it an animal?** (Yes - establishes the category)\n",
            "2.  **Is it a mammal?** (Yes - narrows it significantly)\n",
            "3.  **Is it aquatic?** (Yes - crucial qualifier)\n",
            "4.  **Does it primarily live in freshwater?** (Yes - this eliminates sea mammals like dolphins, seals, whales, sea otters, etc., and focuses on rivers, lakes, ponds)\n",
            "5.  **Is it native to North America?** (Yes - helps narrow down specific species of freshwater aquatic mammals)\n",
            "6.  **Does it have fur?** (Yes - separates it from some amphibians or fish if there was confusion)\n",
            "7.  **Is it known for being playful?** (Yes - strong hint towards otters)\n",
            "8.  **Does it belong to the weasel family (Mustelidae)?** (Yes - This is a powerful question as it directly points to otters, badgers, minks, ferrets, etc. among aquatic mammals, otters are the obvious choice here)\n",
            "9.  **Does it eat fish, crustaceans, and amphibians?** (Yes - typical otter diet)\n",
            "10. **Does it build dens called \"holts\"?** (Yes - confirms it's an otter, not a beaver or muskrat)\n",
            "11. **Is an adult of this species typically larger than a domestic cat?** (Yes - this is key to setting up the next question)\n",
            "12. **Are we referring to a *baby* or *juvenile* of this species?** (Yes - This is the crucial question that explains why it's \"smaller than a cat\" despite the adult being larger.)\n",
            "13. **Is it born helpless and blind?** (Yes - characteristic of otter pups)\n",
            "14. **Does it learn to swim from its mother?** (Yes - typical otter pup behavior)\n",
            "15. **Is it called a \"pup\"?** (Yes - common term for baby otters)\n",
            "\n",
            "At this point, you've almost certainly confirmed it's a river otter pup. You could ask a few more specific questions if you wanted to be absolutely sure, but the combination of freshwater aquatic mammal, Mustelidae family, playful, and specifically being a *baby* when the adult is larger, makes the river otter pup an incredibly strong fit.\n",
            "\n",
            "**Other Less Likely but Possible Considerations (and why they're not as good):**\n",
            "\n",
            "*   **Muskrat pup:** Muskrats are aquatic, freshwater, and pups are smaller than a cat. However, they are rodents, not typically considered \"playful,\" and less commonly thought of as a primary \"aquatic mammal\" in the same way an otter is (though technically correct). Your questions about the weasel family would eliminate them.\n",
            "*   **Mink pup:** Minks are also Mustelids, aquatic, and pups are small. But they are often found in coastal areas as well as freshwater, and are generally more terrestrial than an otter.\n",
            "*   **Water Shrew:** These are *very* small, aquatic, and freshwater. However, they are insectivores, not often thought of as \"mammals\" in the common sense when people play 20 questions (though they are), and don't fit the \"playful\" stereotype. Also, they're so small, calling them \"smaller than a cat\" is an understatement.\n",
            "*   **Platypus pup (if you're thinking globally):** Fits the description, but \"doesn't live in the sea\" is a bit ambiguous as they live in rivers that lead to the sea. The \"mammal\" part is also tricky as they are monotremes. Your \"native to North America\" question would eliminate it quickly.\n",
            "\n",
            "Given the common knowledge and typical scope of 20 questions, the **river otter pup** is by far the strongest and most elegant answer.\n"
          ]
        }
      ],
      "source": [
        "if \"-pro\" not in MODEL_ID:\n",
        "  prompt = \"\"\"\n",
        "      You are playing the 20 question game. You know that what you are looking for\n",
        "      is a aquatic mammal that doesn't live in the sea, and that's smaller than a\n",
        "      cat. What could that be and how could you make sure?\n",
        "  \"\"\"\n",
        "\n",
        "  data = {\n",
        "      \"contents\": [\n",
        "          {\n",
        "              \"parts\": [\n",
        "                  {\"text\": prompt}\n",
        "              ]\n",
        "          }\n",
        "      ],\n",
        "      \"generationConfig\": {\n",
        "            \"thinkingConfig\": {\n",
        "                \"thinkingBudget\": 0,\n",
        "            }\n",
        "      }\n",
        "  }\n",
        "\n",
        "  response = requests.post(\n",
        "    url,\n",
        "    headers={'Content-Type': 'application/json'},\n",
        "    data=json.dumps(data)\n",
        "  ).json()\n",
        "\n",
        "  print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "\n",
        "else\n",
        "  print(\"You can't disable thinking for pro models.\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "16dfc2a51e4d"
      },
      "source": [
        "Now you can see that the response is faster as the model didn't perform any thinking step. Also you can see that no tokens were used for the thinking step:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "5dcd275d0b42"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Prompt tokens: 59\n",
            "Thoughts tokens: None\n",
            "Output tokens: 786\n",
            "Total tokens: 845\n"
          ]
        }
      ],
      "source": [
        "print(\"Prompt tokens:\",response[\"usageMetadata\"][\"promptTokenCount\"])\n",
        "print(\"Thoughts tokens:\",response[\"usageMetadata\"][\"thoughtsTokenCount\"] if \"thoughtsTokenCount\" in response[\"usageMetadata\"] else \"None\")\n",
        "print(\"Output tokens:\", response[\"usageMetadata\"][\"candidatesTokenCount\"])\n",
        "print(\"Total tokens:\", response[\"usageMetadata\"][\"totalTokenCount\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GAa7sCD7tuMW"
      },
      "source": [
        "## Example #2: Physics problem\n",
        "\n",
        "Now, try with a simple physics comprehension example. First you can disable the `thinkingBudget` to see how the model performs:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PZw41-lsKKMf"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Here's how to calculate the maximum bending stress for the cantilever beam:\n",
            "\n",
            "**1. Define Given Parameters:**\n",
            "\n",
            "*   Length (L) = 3 m\n",
            "*   Width (b) = 0.1 m\n",
            "*   Height (h) = 0.2 m\n",
            "*   Modulus of Elasticity (E) = 200 GPa = 200 * 10^9 Pa\n",
            "*   Uniformly distributed load (w) = 5 kN/m = 5000 N/m\n",
            "*   Point load (P) = 10 kN = 10000 N\n",
            "\n",
            "**2. Calculate the Moment of Inertia (I) for a Rectangular Cross-Section:**\n",
            "\n",
            "The formula for the moment of inertia for a rectangular cross-section about the neutral axis is:\n",
            "I = (b * h^3) / 12\n",
            "\n",
            "I = (0.1 m * (0.2 m)^3) / 12\n",
            "I = (0.1 m * 0.008 m^3) / 12\n",
            "I = 0.0008 m^4 / 12\n",
            "I = 6.6667 * 10^-5 m^4\n",
            "\n",
            "**3. Determine the Maximum Bending Moment (M_max):**\n",
            "\n",
            "For a cantilever beam, the maximum bending moment occurs at the fixed end. We need to consider the contribution from both the uniformly distributed load and the point load.\n",
            "\n",
            "*   **Bending moment due to uniformly distributed load (M_w):**\n",
            "    M_w = (w * L^2) / 2\n",
            "    M_w = (5000 N/m * (3 m)^2) / 2\n",
            "    M_w = (5000 N/m * 9 m^2) / 2\n",
            "    M_w = 45000 Nm / 2\n",
            "    M_w = 22500 Nm\n",
            "\n",
            "*   **Bending moment due to point load (M_P):**\n",
            "    M_P = P * L\n",
            "    M_P = 10000 N * 3 m\n",
            "    M_P = 30000 Nm\n",
            "\n",
            "*   **Total Maximum Bending Moment (M_max):**\n",
            "    Since both loads create bending moments in the same direction (causing tension on the top surface and compression on the bottom surface at the fixed end for standard upward loading, or vice-versa), we add them:\n",
            "    M_max = M_w + M_P\n",
            "    M_max = 22500 Nm + 30000 Nm\n",
            "    M_max = 52500 Nm\n",
            "\n",
            "**4. Calculate the Distance from the Neutral Axis to the Outermost Fiber (c):**\n",
            "\n",
            "For a rectangular cross-section, the neutral axis is at the geometric center, so:\n",
            "c = h / 2\n",
            "c = 0.2 m / 2\n",
            "c = 0.1 m\n",
            "\n",
            "**5. Calculate the Maximum Bending Stress (σ_max):**\n",
            "\n",
            "The bending stress formula is:\n",
            "σ_max = (M_max * c) / I\n",
            "\n",
            "σ_max = (52500 Nm * 0.1 m) / (6.6667 * 10^-5 m^4)\n",
            "σ_max = 5250 Nm^2 / (6.6667 * 10^-5 m^4)\n",
            "σ_max = 78749375 Pa\n",
            "\n",
            "**6. Convert to more convenient units (MPa):**\n",
            "\n",
            "σ_max = 78749375 Pa / (10^6 Pa/MPa)\n",
            "σ_max = 78.75 MPa (approximately)\n",
            "\n",
            "**Therefore, the maximum bending stress in the cantilever beam is approximately 78.75 MPa.**\n"
          ]
        }
      ],
      "source": [
        "if \"-pro\" not in MODEL_ID:\n",
        "  prompt = \"\"\"\n",
        "      A cantilever beam of length L=3m has a rectangular cross-section (width b=0.1m, height h=0.2m) and is made of steel (E=200 GPa).\n",
        "      It is subjected to a uniformly distributed load w=5 kN/m along its entire length and a point load P=10 kN at its free end.\n",
        "      Calculate the maximum bending stress (σ_max).\n",
        "  \"\"\"\n",
        "\n",
        "  data = {\n",
        "      \"contents\": [\n",
        "          {\n",
        "              \"parts\": [\n",
        "                  {\"text\": prompt}\n",
        "              ]\n",
        "          }\n",
        "      ],\n",
        "      \"generationConfig\": {\n",
        "            \"thinkingConfig\": {\n",
        "                \"thinkingBudget\": 0\n",
        "            }\n",
        "      }\n",
        "  }\n",
        "\n",
        "  response = requests.post(\n",
        "    url,\n",
        "    headers={'Content-Type': 'application/json'},\n",
        "    data=json.dumps(data)\n",
        "  ).json()\n",
        "\n",
        "  print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "\n",
        "else\n",
        "  print(\"You can't disable thinking for pro models.\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "edf87bae4035"
      },
      "source": [
        "Metadata (Thinking Disabled): As expected, the `usageMetadata` for this request should show a `thoughtsTokenCount` of `0` or absence, as thinking was explicitly disabled in the request payload."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7b59d32afd90"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Prompt tokens: 95\n",
            "Thoughts tokens: None\n",
            "Output tokens: 761\n",
            "Total tokens: 856\n"
          ]
        }
      ],
      "source": [
        "print(\"Prompt tokens:\",response[\"usageMetadata\"][\"promptTokenCount\"])\n",
        "print(\"Thoughts tokens:\",response[\"usageMetadata\"][\"thoughtsTokenCount\"] if \"thoughtsTokenCount\" in response[\"usageMetadata\"] else \"None\")\n",
        "print(\"Output tokens:\", response[\"usageMetadata\"][\"candidatesTokenCount\"])\n",
        "print(\"Total tokens:\", response[\"usageMetadata\"][\"totalTokenCount\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "14873702305e"
      },
      "source": [
        "Then, set a fixed maximum budget `(e.g., thinkingBudget=4096)` for the thinking step by including the `thinkingConfig` object with `thinkingBudget` set in the JSON payload. See how the model's output changes."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "1783ef351094"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "THOUGHTS:\n",
            "**Solving for Maximum Bending Stress in a Cantilever Beam**\n",
            "\n",
            "Alright, let's break this down. The goal is clear: find the maximum bending stress in that cantilever beam. The key here, as always, is understanding where the maximum stress will occur.  With a cantilever, it's a no-brainer – it's at the fixed support, where the bending moment is the greatest.\n",
            "\n",
            "First, I need to have the bending stress formula at my fingertips: $\\sigma = \\frac{M y}{I}$.  $M$ is the bending moment, $y$ is the distance to the fiber, and $I$ is the moment of inertia. I'll need to calculate those.\n",
            "\n",
            "Since it's a rectangular cross-section (b = 0.1 m, h = 0.2 m), the moment of inertia is straightforward.  $I = \\frac{b h^3}{12}$, giving me $I = \\frac{0.1 \\times 0.2^3}{12} = \\frac{1}{15000} m^4$.  For a rectangle, the distance to the extreme fiber, *c*, is just half the height, or 0.1 m.  I've got my section properties sorted.\n",
            "\n",
            "Now for the moment. There are two loads: a point load at the free end and a uniformly distributed load along the entire length.  I need to calculate the moment each load creates at the fixed support (x=0). The point load, with a magnitude of 10 kN at 3 m, creates a moment of $M_P = P \\times L = 30 \\text{ kNm}$. The distributed load of 5 kN/m is essentially an equivalent concentrated load of 15 kN located 1.5 m from the fixed support. So, the moment from that is $M_w = \\frac{wL^2}{2} = 22.5 \\text{ kNm}$.\n",
            "\n",
            "Since they both bend the beam in the same sense, they add. The total maximum moment, then, is $M_{max} = 30 + 22.5 = 52.5 \\text{ kNm}$.\n",
            "\n",
            "Now it's just plugging into the bending stress formula. $\\sigma_{max} = \\frac{(52.5 \\times 10^3 Nm) \\times 0.1 m}{1/15000 m^4} $. Working through the math (making sure to convert to consistent units!),  I get $\\sigma_{max} = 78.75 \\text{ MPa}$.\n",
            "\n",
            "Finally, a quick sanity check. The Young's Modulus was given but it's not needed for *stress* here.  That's for deflection, which wasn't asked for. The calculated stress of 78.75 MPa sounds reasonable for a steel beam, being below typical yield strengths. Done.\n",
            "\n",
            "\n",
            "OUTPUT:\n",
            "Okay, let's calculate the maximum bending stress for this cantilever beam.\n",
            "\n",
            "**1. Identify Given Parameters:**\n",
            "*   Length of beam, L = 3 m\n",
            "*   Width of cross-section, b = 0.1 m\n",
            "*   Height of cross-section, h = 0.2 m\n",
            "*   Young's Modulus, E = 200 GPa (not needed for stress calculation, only for deflection/strain)\n",
            "*   Uniformly distributed load, w = 5 kN/m\n",
            "*   Point load at free end, P = 10 kN\n",
            "\n",
            "**2. Calculate Section Properties:**\n",
            "*   **Moment of Inertia (I) for a rectangular cross-section:**\n",
            "    $I = \\frac{b h^3}{12}$\n",
            "    $I = \\frac{(0.1 \\text{ m}) (0.2 \\text{ m})^3}{12}$\n",
            "    $I = \\frac{0.1 \\times 0.008}{12}$\n",
            "    $I = \\frac{0.0008}{12} = 6.666... \\times 10^{-5} \\text{ m}^4 = \\frac{1}{15000} \\text{ m}^4$\n",
            "\n",
            "*   **Distance to the extreme fiber (c):**\n",
            "    For a rectangular section, c is half the height.\n",
            "    $c = \\frac{h}{2} = \\frac{0.2 \\text{ m}}{2} = 0.1 \\text{ m}$\n",
            "\n",
            "**3. Determine Maximum Bending Moment (M_max):**\n",
            "For a cantilever beam, the maximum bending moment occurs at the fixed support. We need to sum the moments caused by each load about the fixed end.\n",
            "\n",
            "*   **Moment due to the point load (P):**\n",
            "    $M_P = P \\times L$\n",
            "    $M_P = 10 \\text{ kN} \\times 3 \\text{ m} = 30 \\text{ kNm}$\n",
            "\n",
            "*   **Moment due to the uniformly distributed load (w):**\n",
            "    A uniformly distributed load can be treated as an equivalent concentrated load ($w \\times L$) acting at the centroid of the distributed load (which is $L/2$ from the fixed support).\n",
            "    $M_w = (w \\times L) \\times \\frac{L}{2} = \\frac{w L^2}{2}$\n",
            "    $M_w = \\frac{(5 \\text{ kN/m}) (3 \\text{ m})^2}{2} = \\frac{5 \\times 9}{2} = \\frac{45}{2} = 22.5 \\text{ kNm}$\n",
            "\n",
            "*   **Total Maximum Bending Moment (M_max):**\n",
            "    Since both loads cause bending in the same direction, their moments add up.\n",
            "    $M_{max} = M_P + M_w = 30 \\text{ kNm} + 22.5 \\text{ kNm} = 52.5 \\text{ kNm}$\n",
            "    Convert to N.m: $M_{max} = 52.5 \\times 10^3 \\text{ Nm}$\n",
            "\n",
            "**4. Calculate Maximum Bending Stress (σ_max):**\n",
            "The bending stress formula is $\\sigma = \\frac{M y}{I}$. For maximum stress, we use $M_{max}$ and $y=c$.\n",
            "$\\sigma_{max} = \\frac{M_{max} c}{I}$\n",
            "$\\sigma_{max} = \\frac{(52.5 \\times 10^3 \\text{ Nm}) \\times (0.1 \\text{ m})}{6.666... \\times 10^{-5} \\text{ m}^4}$\n",
            "$\\sigma_{max} = \\frac{5250 \\text{ Nm}^2}{6.666... \\times 10^{-5} \\text{ m}^4}$\n",
            "$\\sigma_{max} = 78,750,000 \\text{ Pa}$\n",
            "\n",
            "**5. Convert to Megapascals (MPa):**\n",
            "$1 \\text{ MPa} = 10^6 \\text{ Pa}$\n",
            "$\\sigma_{max} = \\frac{78,750,000}{10^6} \\text{ MPa} = 78.75 \\text{ MPa}$\n",
            "\n",
            "The maximum bending stress in the cantilever beam is **78.75 MPa**.\n"
          ]
        }
      ],
      "source": [
        "prompt = \"\"\"\n",
        "    A cantilever beam of length L=3m has a rectangular cross-section (width b=0.1m, height h=0.2m) and is made of steel (E=200 GPa).\n",
        "    It is subjected to a uniformly distributed load w=5 kN/m along its entire length and a point load P=10 kN at its free end.\n",
        "    Calculate the maximum bending stress (σ_max).\n",
        "\"\"\"\n",
        "\n",
        "thinkingBudget = 4096 # @param {type:\"slider\", min:0, max:24576, step:1}\n",
        "\n",
        "data = {\n",
        "    \"contents\": [\n",
        "        {\n",
        "            \"parts\": [\n",
        "                {\"text\": prompt}\n",
        "            ]\n",
        "        }\n",
        "    ],\n",
        "     \"generationConfig\": {\n",
        "          \"thinkingConfig\": {\n",
        "              \"includeThoughts\": True,\n",
        "              \"thinkingBudget\": thinkingBudget\n",
        "          }\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(\n",
        "   url,\n",
        "   headers={'Content-Type': 'application/json'},\n",
        "   data=json.dumps(data)\n",
        ").json()\n",
        "\n",
        "print(\"THOUGHTS:\")\n",
        "print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "print()\n",
        "print(\"OUTPUT:\")\n",
        "print(response['candidates'][0]['content']['parts'][1]['text'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fe9bafe22c64"
      },
      "source": [
        "Metadata (Thinking Enabled): Now, examine the `usageMetadata` for the call where `thinkingBudget` was set to a positive value. You should see a non-zero `thoughtsTokenCount`, indicating the number of tokens used for the thinking process (which will be less than or equal to the `thinkingBudget` you set)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3dfac516c27b"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Prompt tokens: 95\n",
            "Thoughts tokens: 1674 / 4096\n",
            "Output tokens: 955\n",
            "Total tokens: 2724\n"
          ]
        }
      ],
      "source": [
        "print(\"Prompt tokens:\",response[\"usageMetadata\"][\"promptTokenCount\"])\n",
        "print(\"Thoughts tokens:\",response[\"usageMetadata\"][\"thoughtsTokenCount\"], '/', thinkingBudget if \"thoughtsTokenCount\" in response[\"usageMetadata\"] else \"None\")\n",
        "print(\"Output tokens:\", response[\"usageMetadata\"][\"candidatesTokenCount\"])\n",
        "print(\"Total tokens:\", response[\"usageMetadata\"][\"totalTokenCount\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FTuVuVeAnUVR"
      },
      "source": [
        "Keep in mind that the largest the thinking budget is, the longest the model will spend time thinking, with means a longer computation time and a more expensive request."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ADiJV-fFyjRe"
      },
      "source": [
        "<a name=\"geometry\"></a>\n",
        "## Example #3: Geometry problem (with image)\n",
        "\n",
        "This geometry problem requires complex reasoning and is also using Gemini multimodal abilities to read the image.\n",
        "In this case, you are fixing a value to the `thinkingBudget` so the model will use up to 8196 tokens for the thinking step."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MIcXWXqyzCjQ"
      },
      "outputs": [
        {
          "data": {
            "image/jpeg": "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",
            "text/plain": [
              "<PIL.Image.Image image mode=RGBA size=256x256>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "import base64\n",
        "from PIL import Image\n",
        "\n",
        "!wget https://storage.googleapis.com/generativeai-downloads/images/geometry.png -O geometry.png -q\n",
        "\n",
        "display(Image.open(\"geometry.png\").resize((256,256)))\n",
        "\n",
        "with open(\"geometry.png\", \"rb\") as image_file:\n",
        "     encoded_string = base64.b64encode(image_file.read()).decode(\"utf-8\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Lb9o7AeDwVyZ"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "THOUGHTS:\n",
            "**Calculating the Overlap: A Quadrant's Area**\n",
            "\n",
            "Okay, so I'm looking at this image and immediately, the geometry jumps out. It's about finding the area of the intersection between a circle and a right-angled triangle.  My first observation is the circle.  I see three segments labeled '3' extending from the center – bingo, the radius (R) is 3. The circle is divided into quadrants, and the crucial overlap seems to be the top-right one.\n",
            "\n",
            "The triangle is a right isosceles triangle, also with sides labeled '3'.  That means its legs have a length of 3 and it's a 45-45-90 triangle. Crucially, the right angle's vertex sits *exactly* at the center of the circle, and the triangle's legs are aligned along the x and y axes (assuming the center is at the origin), extending outwards.\n",
            "\n",
            "This makes the overlapping region crystal clear: it's a perfect quarter-circle, or a quadrant. The quadrant is enclosed by the two radii (both length 3) and the circular arc. Because the legs of the triangle are radii of the circle and they have a length of 3, the quadrant is perfectly defined by the legs and the arc of the circle.\n",
            "\n",
            "Now, it's a straightforward calculation.  The area of a full circle is πR², so the area of a quarter-circle is (1/4)πR². Since R = 3, the overlapping area is (1/4) * π * 3², which equals 9π/4. That's it!\n",
            "\n",
            "Just to be certain, I'm mentally re-checking my understanding of the image. The labels \"3\" on the sides of the triangle mean the lengths of the legs are indeed 3, and the labels on the radii of the circle mean the radius is 3. The vertex of the right angle is at the circle's center, and the legs align with the radii. It's just a quadrant! The area is confirmed as 9π/4.\n",
            "\n",
            "\n",
            "OUTPUT:\n",
            "The image shows a circle and a right-angled triangle overlapping. Let's break down the information given by the labels:\n",
            "\n",
            "1.  **The Circle:**\n",
            "    *   There are segments labeled '3' extending from the center of the circle to its circumference. This indicates that the **radius (R) of the circle is 3**.\n",
            "    *   The circle is implicitly centered at the vertex where the two legs of the right-angled triangle meet.\n",
            "\n",
            "2.  **The Right-Angled Triangle:**\n",
            "    *   The two sides forming the right angle (the legs) are both labeled '3'. This means the **length of each leg of the triangle is 3**.\n",
            "    *   Crucially, the right-angle vertex of the triangle coincides with the center of the circle.\n",
            "    *   The legs of the triangle extend along two perpendicular radii of the circle.\n",
            "\n",
            "3.  **The Overlapping Region:**\n",
            "    *   The overlapping region is bounded by the two legs of the triangle (which are also radii of the circle) and the arc of the circle.\n",
            "    *   Since the legs of the triangle have length 3, and the radius of the circle is 3, the triangle's legs perfectly align with the radii that define a quadrant (a quarter-circle).\n",
            "    *   Therefore, the overlapping region is exactly a **quadrant of the circle** with radius R = 3.\n",
            "\n",
            "**Calculation:**\n",
            "The area of a full circle is given by the formula A = πR².\n",
            "The area of a quadrant (a quarter of a circle) is (1/4) * πR².\n",
            "\n",
            "Substitute the radius R = 3 into the formula:\n",
            "Area of overlapping region = (1/4) * π * (3)²\n",
            "Area = (1/4) * π * 9\n",
            "Area = **9π/4**\n",
            "\n",
            "The final answer is $\\boxed{\\frac{9\\pi}{4}}$.\n"
          ]
        }
      ],
      "source": [
        "prompt = \"What's the area of the overlapping region?\"\n",
        "\n",
        "data = {\n",
        "    \"contents\": [\n",
        "        {\n",
        "            \"parts\": [\n",
        "                {\"text\": prompt},\n",
        "                {\n",
        "                    \"inlineData\": {\n",
        "                        \"mimeType\": \"image/png\",\n",
        "                        \"data\": encoded_string\n",
        "                    }\n",
        "                }\n",
        "            ]\n",
        "        }\n",
        "    ],\n",
        "     \"generationConfig\": {\n",
        "          \"thinkingConfig\": {\n",
        "              \"includeThoughts\": True,\n",
        "              \"thinkingBudget\": 8196\n",
        "          }\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(\n",
        "   url,\n",
        "   headers={'Content-Type': 'application/json'},\n",
        "   data=json.dumps(data)\n",
        ").json()\n",
        "\n",
        "print(\"THOUGHTS:\")\n",
        "print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "print()\n",
        "print(\"OUTPUT:\")\n",
        "print(response['candidates'][0]['content']['parts'][1]['text'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EXPPWpt6ttJZ"
      },
      "source": [
        "<a name=\"brain\"></a>\n",
        "## Example #4: Brain teaser with a twist\n",
        "\n",
        "Here's another brain teaser based on an image, this time it looks like a mathematical problem, but it cannot actually be solved mathematically. If you check the toughts of the model you'll see that it will realize it and come up with an out-of-the-box solution.\n",
        "\n",
        "In this case, you are fixing a value to the `thinkingBudget` so the model will use up to 24576 tokens for the thinking step."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "F2YeBqzC0J_i"
      },
      "outputs": [
        {
          "data": {
            "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAO6BJADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDxLHFAFFLWRzhRRS0wCiiigAooooAKWiigQUtJS0AFLiilpAFFFLQAYpaKKBBRRS0AFAopaACiiigAoxS0UCCiiloAKAKMUuKACiiloAKKMUtAhKMUtFABRRS0AJS0UuKAEpaKKQBRRS9qYCUtFFACUtFLQISlopaAEopaKAExS0UUAFFFLQAUUUUAFFFFABRRRQAUUtFACUtFLSATFFLRigBMUYpRRQAmKKWigApKWg0AJ3opaKAExRilooATFFLSUAGKSlooASjFLSUAFJS0YoAKKKKYBRRRQAUlLRSASkpaKYCUUtGKAEpKWigApKWigBKTFLRQMSilpKAEpKWigBKSlooASkpaKAEoxS0lIBKKWkpjCkpaKAEooooASilpKAEoNLSUDEopaSgBDRS0hoASkpaDQMaaSnGkxQAlFFFMApKWkoAKKKKBiUUtJQAlFHSkpDCilpKAEooopgJRS0lICSilpKYgpaKKACiiigApaSloEGKMUUtIAoAopRTAWiiikAtFFLQIKKKWgAoopaACiiigBaKKKBBS0lLigApQKMUtIBKWiimIKWkpaACiiigAopaKACiiloAKKKKACilooAKO9FLQIKKKKACilooABRRRQAUUtFABRRRQAUUUtACUUtFIAoopaAEopaKACiiigQUUUtACUGlooASilpKACloooASilooASilooASilooASiiigAoopaAEpKU0UAJRS0UDEopaSgBKKWigBKKWjFACUUUUAJRS0UAJRS0lMAxSUtFACUUUUAJRS0lAxKKWkoASilpKAExSU6kNIBKSlopgJRS0lIApKWigY2ilopgJRRiigBKKKKBiUUtFADaKWkoASkp1JQMQ0lLSUAJSU6kNMBKKKKAEopaSgYUlLRQAlJS0UAJSUtJSGFJS0UAJRRRTAkooooEFFFFABRRS0AJS0UUCFoooApAKKWiigApaSnUCCiiigApaKWgAooooAKWiigQUUtFABS4oFFAC0UUtAgooooAMUUtGKAEpaWigBKWiigAoopcUAJS0UUAFFLRQIKBRRQAUtGKKACiiloASloooAKKKKACgUUopAFFLRQAUUUtACUUtFABRRRQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApKWigApKWigBKKWigBKKKKACiiigAooooAKKKKBiUlLRQAlFFFABSUtFMBKKWkoAKSlooASilpKAEopaSgBKKWkoGFJS0YoAaaKWikA2ilpKAEopaKAG0UtFMYlJS0UAJRS0lACUUtJQMSkp1JQAlJS0UAJSUtJQMSkp1J3oAbRS0lABSUtFMYlFFFACUUtJQAhpKdTaQwpKWigBKKKKYElFFFAgpaKKBBRRRigAopaKQAKdSYpaACgUUtABS0UUCCloooAKWiigApaKKAFooooEApcUUUAFLRRQIWigUUAFLiil7UgEpaKKYBS0UUgCiiimAUUUUALRRRQIKKKWgAoxRRQAUUUtABRRRQAUUUUAFFGOKWkAClxRRQAUUtFAgooooGFLSUUCCiiigAooooAKKKKACiiigAopaSgAopaKAEooooAKKKKACiiigAooooAKKKKACiiigAooooATFFLRQAlFLRQAlFLSUAFJiloIoGJSUtFACUUUUwCiiigBKKWkoAKKKKAEopaSgApKWigYlJS0UAJSU6koASkpaMUgG0UppKACkpaKAEpKWigYlJS0UwEooNFACUUUUDEpKWkoAKSlpDQAlBoooGIaSlxSYoASkpe9FMBKKKKBhSYpaKAEpKU0GkAlJS0lACUtFFAySkpaKZIUUUUAFLSUtABRRSigBaKKKQC0UCloEFFFLQAUtJS0AFLRRQAUUUtAgoopaACloopCClpKWmAUUUtAAKWgUUgFopKWgAooopgFFFLQAUUUtAhKWiigAooooAKKWigAooooAKKKKAAUtFHWkAUUuKKACloooAKKKWgQlLSUUAFFFFABRRRQAUUtFABRRRigAoxS0lABRS0lABSUtFACUtFFABSUtFACUtFFACUUUtACUUtFACUUtFACUUUUAFFFFABRRRQAUUUUAFJS0UANIopaSgYUlLRQAlFLRQAlFFFMAooooASiiigBMUUtFACUlLSUAFJS0UDEpKWikA2ilpKAExRRRQAlFFFACUUtFAxKTFLRTASkpaKBiUlLRQAlIaWigBtJTqSgBKSlpO9AxCKSlNFMBKKKKAEopaSgYUlLSUAJiigiikAlFLSUASUUUUxBQKKWgAoopaACloopAFLRRQIWiiigBaKKKAFpaSloAKKKWgQlLRRQAtLSUtIAooopiFoopaQBS0lLTAKKKKAFoopaQCUtFFMQUUUtABRRRQAUUUUAFFFLQAUUUUAFFFLQAlLiiikAUtFFABS0lLQIKKKKACiiigAoopaACiiigAopaKAEpaKKACiiigAooooAKKKKAEopaKAEpaKSgAooooAWkopaAEopaKACkpaKAEooo60AFJS0UAJRRS0AJRRiigAopaSgAooooAKSlooASilpKBhSUtJQAUlLRQAlFLSUAFJS0UAJRRRTASilpKAEopaSgYUlLSUAJRS0lIBKQ0tJQAUlKaSgAooooGJRS0lMBKKKKAEopTSUDCkpaQ0AFNNOpDQAlJS0lAxKSlNFADaKWkoAKSlopjCkpaSgBKSnUhFACUUUUhj6KKKZIoooAopALiilooAKWkpaACiiloEFLSUtABS0UUALRRRQIKWiigApaBRSAWiiimIKXvRRQAtFFFIBaWk70tMAoopaQBRRRQIKKKKYC0UUUAFFFLSASloooAKKKKYBRRRQAtFFFIApaSloAKWkpaBBRRRQAUUUUAFFFFABS0Ud6ACloooAKKKKACiiigAooooAKKKKACiiigAoopKAFpKWigBKKKKAFopKKACloooAKKKKAEFLRRQAUlLRQAmKKKOlABRRRQAUlLSUAFFFFABRRRQAUlLRQAlFFFABSUtFAxKSlooASiiimAlFLRQAlFFFACUhpaKAEpKWigYlJS0UAJSUppKQCUUtJQAUlLRTASkpTRSGJSUtFMBKSlooGJRRRQAlFFFACEUlOptACUlOpKBiUlLSUAJRRRTASloooGJRRRQAhpKU0UgHUUUtAgFLSUopgLRRRSAWiiloEGKKKWgBKdSUtABilpKWgAxS0CigQUUUtABS0UUgClpKWmIKWkpaACloooAKWkpaACloopCCiiimAUtFFIAooooAKWiigAooopgFFFLQAUUUUgCiloFABRRS0CCiiigAooooGFFFFAgoopaACiiigBaKKKACiiigAooooAKKKKACiiigAoo7UUAFFFFACUtFFACUtFFACUtJS0AFFFFABRRRQAUUUUAFJS0UAJRS0lABRRRQAlFFFABRRRQAUUUUAFFFFABSUtFACUUUUAFJS0UDEpKWkoAKKKKYCUUUUAFJS0UAJSUtFACUlLRQMbRS0lACUUUUgEopaSgApKWkoASiiimMQ0UtJQAUlLRQMSkxS0GgBKSlpDQAlFFFAxKbTjSUAJSUtJTAKSlpKACg9KKKBhSdqWkoAdS0d6DSEFOpBS0AFLRRQIKWkp1ACUtFFABS0lLQAtFFFAhaKKWgAooooAWiiigQtFFFAC0UUUALRRQKAFxRRRSAWiiimIKKKWgAooopAFFLRQAUUCigApaKKAEpaKKACilooAKWkpaACiiigQUUUUAFFFFABRRRQAUUUtABR2opaACiiigAoopaAEopaKAEooooAKKKKACijtRQAUUUUAFFFFABRRRQAUUUUwCiiikAUUUUAFFFFABRRRQAlLSUUAFFFHegBKWikoAKKKKYBRRRSAKKKKACiiigBKWiigApDS0UAJikpaSgYlFLSUwCiiikAlFFFMBKKKKACkNLSUgEpKdSd6YxKSnUlIBKSlooASiiigBKSlopjEooooASiiigYlFLSUAJRRRQA2ilNJQAUlLSUDGmkpxpMUwEooooAKSlpKBhRRRQA6iiikIUUtIKWgBaKKKYhaWkopALRRRQAopaQUtAAKWkpaBBSikooAWlpKWgApaKKBBS0lLQAUtJS0AFLSUtIApaSloAKKKKYgpaSlpAFFFLQAUUUUAFLQKKAClpKWgAoxRQKAFooooEFFFFMAooooAKKKKACiiigAoopaAEpaKKQC0UUUAFFFGKAFooo7UAFFFFAgpKWjFACUtFFABRRRQAUUUUAJS0UUDCkpaKBCUUtJQAUUUUDCiiigAooopgFFFFIBKKKKACiiigApKWimAlFFFABRRRQAUUUUgCiiigAoopKACilpKACiiigYlJS0lABRRRQAlFLRQAlJS0UwEooooASkpaKBiUlLSUAFIaWigBKSlpKQBSUtJQMSilpKYBSUtJQAUlLRQMSkpaSgBKSnUlACUUUUDGnrSU40lACGkpaSgAoNFFMApKWkoGONKKSlFAhaKKWkIKKKKYC0UUtIAooooAWlpBS0AFLSUtAgpaSloAWiigUCFooooAWiiloAKKKKACloopALRRRQAUUUUxC0UUUALRRRQAUtFFIAoo70tABRR0ooAWikooELRRRTAKKKKACiiloAKSlooASilooAKKKKACloooAKKKKQC0UUYoAKKKKACiiigQUUUUAFFFLQAlFLRQAlGKWigBKKWk7UAFFLSUAFJS0UAJRRRQAUUtJQAUUUUDCkpaKAEooopgFFFFABRRRQAlFLRQAlFFFABRRRQAUUUUgCkpaKAEooooAWkoooAKSlNJQMSiiimAUUUUgEooopgJRRRQAlFLSUAJRS0lAxKKKKQCUUtJQAlJS0UxiUlLSUAFFFFACUUUUDEpKU0lABSGlooAbRRRQAlJS0lAwpKWkNACGiiimAUUUUAOoFHWlpAFLSUtAgpaSlpgFLSUtIAooooAWlpBS0AFLRRQIWiiigBaKKBQAtLSUtAgpaSlFABRRS0gCiigUALRRRQIKWkpaYBS0lLQAUUUUAFLRRSAKWgUdKACij3paACiikpiFpKWigAooooAKKKWgAopKWgAooooAKWkpaACiiigApaKKQBRRRQAUUUtAhKKKKACiiloAKKKKACiiigAooooAKKKKACiiigBKKWkoAKSlooAKKKKACkpaSgAooopjCkpaKAEooooAKKKKACiiigBKKKKACiiigAooooAKKKKAEpaSigBaSlpKADvSUtJSGJRS0lMAooopAJRRRTASilpKACkNLRSASkpaKYxKSlpKQBSUtFMBKSiikAUhpaSgYlFFFMBKKKKAEooooGJRRRQAlJS0lABSGlpDQMSkNLSGgBMUUtJTAKKKKAHUtFFABS0UUhBS0lLTAKWkpaQBS0lLQACl70lKKBC0UUCgBaKKKAFoFFLQIKWkpaAClpKWkAtFFFMApaSlpAFFFFAhaKKKYC0UUUAFFFFAC0UUUgAUtFFABRS0UCEpaKKYBRRRQAUUUUALRRQKACiiigAooooAWikpaACiiigBaKKKQBRRQKBBS0neloAKKSloAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAEopaSgAooopgFBopKACiiigYUUUUAFJS0UAJRRRQAUUUUAFJRRQAtFFFACUUUUAFJS0lABRRRQAtJRRQAd6KKQ0gA0lLSUDCiiigBKKWkpgFJS0UAJRRRSASilpKBiUUGjtTASiiigBKSlpKQBSUtJTASiiigYlFLSUAJRQaDQMKSlpKAENJTu1NoAKKKKBjaKWkoASkPalpKYBRRRQA4UtFFAhaKKKQBS0lLQAtFJS0AHeloooAWiiigQtLSUtABRRS0CClpKWgApaSlpAFLRRQAtFFFMApaKKQBRRRQIWiiimAtFFFABRRRQAtFJS0AFLSUtIAoopaBBRRRTAKKKKACiiigApaKKACiiigAooooAWikpaACiiigApaKKACiiikIKWkooAWiiigAooooAKKKKACiilpgJS0UUAFJS0UAJRRRQAUUUUAFJS0UgEopaSmAUUUlABRRRQAUUUUAFFFFAwpKWkNABRRRQAUlLSUALSGiigAooooAKSlpKACiiigAooooAKKSikAUlLRTASiiikMKSlpKYBRRRQAlFFFIApKWkoATvRS0lAxKKKKAEoooNACUUGimAlJS0hoGFJS0lABSUtJQMKSlpKACkNLSGgBKKKKAEpKdTTQMKSlpKYBSUtFADhRRS0gCiiigQU6m04UAFLSUtABRRRQAtLSUUCFpaSloAKKKKBC0tJS0AFLSUtIApaSloAWiigUwFooopAFFLSUCFFLSUtMAooooAKKKKAClpKWgAxS0lLSAKWkpaBBRRRTAKKKKAClpKWgAooooAKKKKACiiloAKKKKACiiigBaKSloAKKKKQBRRRQIWikpaAAUUUUwCiiloASloooAKKKKACikpaACkoooAKKKKACiiigBKKKKACiiigBKKKKACiiigAooooGFFFFACUUUUAFJS0UAJS0UUAJRRRQAUlLSUAFFFFABRRRSASiiimAUUneigYUUUUgCiikoAKKKKAEopaSmAGkpaSgApKKKBiUUUUgEoooNACUUUUwEooopDEpKWkpgFJS0UDEpKWkoAKSloNACGkpTSUAFIaWkoGJQaD1ooASig0UwHUopKKQhaKKKAFpaSloAKKKWgAooFFAC0UUUCFpaQUtABS0lLQIWikpaAClpKWkAooFFFAC0UUUwFooooAKWkpaQAKWkpaYgooooAKKKKAClpKWgApaSlpAFFFFAC0UUUCCiiimAUtJS0AFFFFABRRRQAtFFFABRRRQAUUUUAFFFLQAUUlLQAUUUUhC0UlLQAUUUUwCiiigBaKSloAKSiigAooooAKKKKACiiigAooooAKKKSgApKWkoAKKKKACiiigYUlLSUAFFFFABRRRQAUlLRQAUUUUAJRRRQAlFLSUAFFFFABRRRSASilpKAA0lLSUxhRRRQAUUUUAJRS0lACUUUUAFJS0lAxKKKKQCUUUUAJRRRQAlHeiimAUhpaSkMSiig0wEooooGJSUtFACUUUUAIaSlNJQAUUUUDGmg0UlAAaKKKYDqWkpaQgopaSgBaWkpaACiiloAKKKWgQUtJS0AApaSlpAFFFLTELRSUtABS0lLSAWiiigBaKKKYBS0UUAFLSUtIAoopaYgooooAKKKKAClpKWgApaSigBc0UCikIWikpaACiiimAUtJS0AFFFFABRRRQAtFFFABRRRQAUUUUgCiiimAtFFFIAFFFFAhaKKKACiiigAooooAKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUAFJRRQAUlLRQAlFFFAwooooAKKKKACkpaSgAooooAKKKKACkpaSgAooooAKKKKAEoopaAEooopAFJS0lABSUtJTGFFFFABRRRSASiiimAlFFFABSUtJSGJRRRQAlFBooASig0UAJRRRTASg0UlAwooooASkpaSgYUlLRQAlFFFACGkpxptABSUtJQAUlLSYoGIaTpS0UwHUtJS0AFFFApCFpaSloAKWkpaAFooooEFLSUUALS0lLQAUtJS0CFoooFABS0lLSAWiiigBaKKKYBS0lLQAUUUUALS0lFAhaKSloAKKKKACiiigApaSloAKWkopALS0lFAhaKSlpgFFFFABS0lFAC0UUUAFLSUUALRRRQAUUUUAFFFFABS0UUAFFFLSEFFFFABRRRQAUUUUAFFFFABRRRTAKKKKACiikoAWiiigAopKWgBKKWkoAKKKOlIYUlLSUwCiiigAooooAQ0UUUAFFFFABRRRQAlFFFABRRRQAUlLSUAFLRSUAFFLSUgCkpaQ0DCkpaSmAUUUUgCkpaSgAooopgJRRRQAlFFFAxKKKKQCUUUUAJRRSUAFFFFMBKSloNAxKKKKAENFFFACUUUUDEooooADTTS0lABSUtJQAUlLSUDE7UlLRTAdS0lLSAKKBRTELS0lLSAKWkooAUUtIKWgApaSloEFLSUtABS0lLQIKWkpRQAUtJS0gFoopaACiiimAUUUUAFLSUtABS0lFAh1FJRQAtFFFABRRRQAUUUUALRRRQAUtJS0hBS0lLQAUUUUwCiiigApaSloAKKKKAFpKKWgAooooAKKKKACiiigBaKKKBBRRS0gCikpaACiiigAooooAKKKKYBSUZooAKWkpaACikpaACikpaACkoooAKKKSgYUUUUAFFFFABSUtJQAUUUUAFFFFABRRRQAlFFFABRRRQAUlLSUAFFFFABRRRSAKSlpKBhSUtFACUUUUwCkpaQ0gCiiimAlFFFACUGiigYlFFFIBKKKKAEooooASig0lMApKWkoGFFFFACUUUUAJRRRQMSiig0AJSUtJQAUlLRQMbRSmkoAQ0lLRTAdS0lFIBaKKBQIXvS0neloAKWkooAXtS0lLQAUtJRQIWlpKWgBaKKKBBS0lLQAUtFApALS0nWloAKKKKYBRRRQAUtJS0AFLSUUCFooooAWikpaACiiigBaSjtRQAUUUUAL3ooo7UCFpaSikAUtFFMAooooAKWkpaACiiigApaSigBaKSloAKKKKACiiigApaSigBaKKKQBRmiigQUtJRQAUUUUALSUUUwCiiigAooooAKKKKACiiigAoNFGaBiUUUUAFFFFABRSUUAFFFFABRRRQAUUUlABS0UlABRRRQAUUUUAFJS0lABRRRSAKKKSgYUUUmaAFpKKKYBRRRQAUlFFABSUtFACUUUUhiUUUUwEooopAIaKKSgApKWkoAKSlpKACkpTSUxhRRRQAlFFFACUUUUDCkNFFACUlLSUAFJS0lAxDQaKKAEoHWiimA6iiikAtFFFMQU6m0tIBaKKKAClpKWgBaKKWgQUtJS0AFLSUtABS0gpaBAKWkpaQC0UlLTAWiiigAooooAKWkpaACiiikIWikpaYBRRRQAtFJS0AFFFFABRRRQAtLSUUgFFFFFAgooopgLRRSUALRRRQAtFJS0AFFFFABRRRQAtFFFABRRRQAUUUUCClpKKBi0lFFAhaKSloAKKKKQBRRRQAUUUUAFFFFMAooooAKKSigAooooGFFFFABRRRQAlFFFABRRRQAUUUlAC0UUUAFJQaKACiiigAoopKACiiigAooopAFJRmigYGkoopgFFFFABRRRQAlFFFABSUUUAFFFFACUUUUDEpKWkpAFJRRTAKQ0tJSAKSlpKACkoopjCiiigBKKKKAEpKWkoGFJS0lABSUUUAFJRRQMSiikpgFFFFADqKKKQC0UlLQIKWkpaAClpKKAFpaSloAWlFJQKAFpaSloEFLSUtAgpaSloAKWkpaQBS0lLQAtFFFABRRRTAWiiigAooooAKWiigQUUUUALRRRQAUUUUAFFFFAC0CkpaAFooooEFFFHagAooooAKWkpaACiiigBaKSloAKKKKACiiigBaKSloAKKKKACiiigQUUUUAFFFFABS0lFAC0UlLQAUUlFAC0UlFABRRRQAUUUUAFFFJQMWkoooAKKKKACiiigAooooASiiigAooooAKKKKACiiigApKKKACiijNIApKKSgYtJRRTAKKKKACiiigApKKKACiiigBKKKKBhSUtJQAUlFFABSUtJSASiiimAlFFFABSUtJSASiiimMKKKSgApKWkoGHekpaSgApKWkoATvRRRQAlFFJQMKSlpKYBRRRQAtLSdqWkAUtJRQIWlpKKAFooooAKdTadQAUtJSigBaBSUtAhaKKKAFoFFLQIKWkooAWlpKWkAvaik7UtABRRRTAWiiigAooooAWiiigAooooEFFFFAC0UUUAFFFFAC0UlLQAtFJS0CCgUUUAFFFFABS0lFABS0lLQAUtJS0AFFFFABRRRQAUUUUAFLSUUALRSUtABRRSUALRSUUALRSUtAgooooAKKSloAKKKKA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",
            "text/plain": [
              "<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1168x954>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "!wget https://storage.googleapis.com/generativeai-downloads/images/pool.png -O pool.png -q\n",
        "\n",
        "display(Image.open(\"pool.png\"))\n",
        "\n",
        "with open(\"pool.png\", \"rb\") as image_file:\n",
        "     encoded_string = base64.b64encode(image_file.read()).decode(\"utf-8\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Vt2dSjeqA9ZC"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "THOUGHTS:\n",
            "**Decoding the Pool Ball Puzzle**\n",
            "\n",
            "Alright, let's break this down. The user's after a way to get three pool balls to add up to 30. Looking at the options – 7, 9, 11, and 13 – it's immediately obvious that a straightforward sum isn't going to work.  My initial reaction is to just go through combinations, which I do, but of course, none of them equal 30.\n",
            "\n",
            "This screams \"manipulation\" – they practically spelled it out! In a pool context, what can be manipulated? Well, you can't really change the numbers on the balls, but perhaps their *orientation*? That's when the \"9\" immediately jumps out. Flip it over, and you've got a \"6\".\n",
            "\n",
            "Let's swap that 9 for a 6 and try again. Now, with the set 7, 6, 11, and 13, I experiment, and *voila* - 6 + 11 + 13 = 30.  There it is!  It has to be the 6-ball (which we've created from the rotated 9), the 11-ball, and the 13-ball.\n",
            "\n",
            "I briefly double-check to make sure no other number could similarly be manipulated, but 9 is the only viable candidate. The question's wording supports this; they *want* a non-standard solution.  So, the answer is: Rotate the 9 ball to make it a 6 ball, and then use that, along with the 11 ball and the 13 ball to sum to 30. Easy enough, with a bit of a creative spin.\n",
            "\n",
            "\n",
            "OUTPUT:\n",
            "This is a classic riddle that relies on a visual trick!\n",
            "\n",
            "Here's how you do it:\n",
            "\n",
            "1.  **Take the 9-ball.**\n",
            "2.  **Manipulate it by rotating it upside down.** When you turn the 9-ball upside down, it becomes a **6-ball**.\n",
            "3.  Now, select these three balls:\n",
            "    *   The **6-ball** (which was originally the 9-ball, just flipped)\n",
            "    *   The **11-ball**\n",
            "    *   The **13-ball**\n",
            "\n",
            "Add them together: **6 + 11 + 13 = 30**\n"
          ]
        }
      ],
      "source": [
        "prompt = \"How do I use and manipulate three of the pool balls to sum up to 30?\"\n",
        "\n",
        "data = {\n",
        "    \"contents\": [\n",
        "        {\n",
        "            \"parts\": [\n",
        "                {\"text\": prompt},\n",
        "                {\n",
        "                    \"inlineData\": {\n",
        "                        \"mimeType\": \"image/png\",\n",
        "                        \"data\": encoded_string\n",
        "                    }\n",
        "                }\n",
        "            ]\n",
        "        }\n",
        "    ],\n",
        "     \"generationConfig\": {\n",
        "          \"thinkingConfig\": {\n",
        "              \"includeThoughts\": True,\n",
        "              \"thinkingBudget\": 24576\n",
        "          }\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(\n",
        "   url,\n",
        "   headers={'Content-Type': 'application/json'},\n",
        "   data=json.dumps(data)\n",
        ").json()\n",
        "\n",
        "print(\"THOUGHTS:\")\n",
        "print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "print()\n",
        "print(\"OUTPUT:\")\n",
        "print(response['candidates'][0]['content']['parts'][1]['text'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JyOLwLVlz-rP"
      },
      "source": [
        "<a name=\"math\"></a>\n",
        "## Example #5: Math puzzle\n",
        "\n",
        "This is typically a case where you want to fix a budget, as the model can spend a lot of time thinking in all directions before finding the right answer. It should not be too low either as non-thinking models have trouble with such questions.\n",
        "\n",
        "Play with the thinking budget and try to find how much it needs to be able to find the right answer most of the time.\n",
        "\n",
        "Note that Pro is usually better than Flash for those kind of riddles, but does not have the thinking budget yet."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ixUsKEDFz980"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "THOUGHTS:\n",
            "**A Dive into Number Manipulation: Finding 565**\n",
            "\n",
            "Alright, let's break this down. My goal is to craft the number 565 using 10, 8, 3, 7, 1, and 5, each used only once, and sticking to addition, subtraction, multiplication, and division. Since 565 is big, multiplication's the key.\n",
            "\n",
            "First thought: get close with multiplication.  8*7 gets me to 56, and that's awfully close to 560, which leads me to 8*7*10 = 560. Then, I need to add 5.  This one works!  I can see one solution: (8 * 7 * 10) + 5 = 565, however, the challenge *implies* I need to use all the numbers.\n",
            "\n",
            "Okay, let's regroup. I have to think harder about using *all* the numbers. Since the target number ends in 5, maybe I can find a way to use 5 as a multiplier or somehow end up at 565 with multiplication by 5.\n",
            "\n",
            "If I divide 565 by 5, I get 113.  Can I make 113 using the remaining numbers? Let's give it a try.  I can quickly see that 10 * X should be close to 113. That gets me to {10, 8, 3, 7, 1} and the task of making 113. \n",
            "\n",
            "I experiment with a few more variations but keep arriving at the same solution. After more exploring, I've got one valid solution.\n",
            "\n",
            "In a moment of brilliance, I can formulate the following solution:\n",
            "1.  Add 7 and 3, then subtract the result: 7-3 = 4 and 10 and 10 +4 +1 = 14\n",
            "2. Multiply 8 and then add 1.\n",
            "3. Finally multiply the result with 5 and, finally, that equals 565.\n",
            "This checks all the boxes: all the numbers are used once, and only basic operations are used. And, more importantly, I get 565!\n",
            "\n",
            "\n",
            "OUTPUT:\n",
            "To obtain 565 using the numbers 10, 8, 3, 7, 1, and 5, with each number used only once and using common operations, here's a step-by-step solution:\n",
            "\n",
            "1.  **Combine 10, 7, and 3:**\n",
            "    (10 + 7 - 3) = (17 - 3) = 14\n",
            "    *(Numbers used: 10, 7, 3. Remaining: 8, 1, 5)*\n",
            "\n",
            "2.  **Multiply by 8:**\n",
            "    14 * 8 = 112\n",
            "    *(Numbers used: 10, 7, 3, 8. Remaining: 1, 5)*\n",
            "\n",
            "3.  **Add 1:**\n",
            "    112 + 1 = 113\n",
            "    *(Numbers used: 10, 7, 3, 8, 1. Remaining: 5)*\n",
            "\n",
            "4.  **Multiply by 5:**\n",
            "    113 * 5 = 565\n",
            "    *(Numbers used: 10, 7, 3, 8, 1, 5. All numbers have been used exactly once.)*\n",
            "\n",
            "**The full expression is:**\n",
            "((10 + 7 - 3) * 8) + 1) * 5 = 565\n"
          ]
        }
      ],
      "source": [
        "prompt = \"\"\"\n",
        "   How can you obtain 565 with 10 8 3 7 1 and 5 and the common operations?\n",
        "   You can only use a number once.\n",
        "\"\"\"\n",
        "\n",
        "thinkingBudget = 24576 # @param {type:\"slider\", min:0, max:24576, step:1}\n",
        "\n",
        "data = {\n",
        "    \"contents\": [\n",
        "        {\n",
        "            \"parts\": [\n",
        "                {\"text\": prompt},\n",
        "                {\n",
        "                    \"inlineData\": {\n",
        "                        \"mimeType\": \"image/png\",\n",
        "                        \"data\": encoded_string\n",
        "                    }\n",
        "                }\n",
        "            ]\n",
        "        }\n",
        "    ],\n",
        "     \"generationConfig\": {\n",
        "          \"thinkingConfig\": {\n",
        "              \"includeThoughts\": True,\n",
        "              \"thinkingBudget\": 24576\n",
        "          }\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(\n",
        "   url,\n",
        "   headers={'Content-Type': 'application/json'},\n",
        "   data=json.dumps(data)\n",
        ").json()\n",
        "\n",
        "print(\"THOUGHTS:\")\n",
        "print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "print()\n",
        "print(\"OUTPUT:\")\n",
        "print(response['candidates'][0]['content']['parts'][1]['text'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vGw19yPhcOc9"
      },
      "source": [
        "<a name=\"gemini3\"></a><a name=\"thinkingLevel\"></a>\n",
        "# Thinking level for Gemini 3"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "I0Gt67OplkxZ"
      },
      "outputs": [],
      "source": [
        "# @title Run this cell to set everything up (especially if you jumped directly to this section)\n",
        "import json\n",
        "import requests\n",
        "from google.colab import userdata\n",
        "\n",
        "GOOGLE_API_KEY = userdata.get('GOOGLE_API_KEY')\n",
        "\n",
        "# Select the Gemini 3 model\n",
        "\n",
        "GEMINI3_MODEL_ID = \"gemini-3-pro-preview\" # @param [\"gemini-3-pro-preview\"] {\"allow-input\":true, isTemplate: true}\n",
        "url = f\"https://generativelanguage.googleapis.com/v1beta/models/{GEMINI3_MODEL_ID}:generateContent?key={GOOGLE_API_KEY}\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "aUBeYvL70O4y"
      },
      "source": [
        "Instead of using a `thinkingBudget` like the 2.5 generation, the third generation of Gemini models uses \"Thinking levels\" to make it simpler to manage.\n",
        "\n",
        "You can set that thinking level to \"low\" or \"high\" (which is the default for `gemini-3-pro-preview`). This will indicate to the model if it allowed to do a lot of thinking. Since the thinking process stays dynamic, `high` doesn't mean it will always use a lot of token in its thinking phase, just that it's allowed to.\n",
        "\n",
        "`thinkingBudget` is still supported by Gemini 3 Pro.\n",
        "\n",
        "Check the Gemini 3  documentation](https://ai.google.dev/gemini-api/docs/gemini-3) for more details."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "5t_YHsJDLi0E"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "THOUGHTS:\n",
            "**Okay, here's my thought process on this riddle:**\n",
            "\n",
            "First off, I'm breaking down the task – figure out what the riddle's talking about. The clues are clear: something moves in a non-traditional way, has no set form, and can survive being chopped up. The clincher is the \"no brain, maze solver\" part - that's *got* to be the famous slime mold, *Physarum polycephalum*. It’s a classic biology fact!\n",
            "\n",
            "Then, I'm checking the image. It’s got these pool balls with numbers. The numbers are consecutive odds, but what does that have to do with the riddle?  At first glance, it feels like a red herring, or maybe a “follow the pattern” type thing? Maybe the numbers are a cipher? But it’s a distraction. The text's description is too specific.\n",
            "\n",
            "I start to wonder if the image is a code. \"G I K M\" doesn't immediately strike me. Is there a connection to the word \"pool\" or \"billiards\" somehow? Maybe a double meaning with \"slime pool\"? It's a stretch. The text strongly suggests **Slime Mold**.\n",
            "\n",
            "I go back to the text. The slime mold clues are just spot on: movement, no shape, and the maze-solving ability. I make the call - **Slime Mold** is my answer.\n",
            "\n",
            "Finally, I address the image.  It *could* be relevant. Numbers are cool, maybe it's \"G I K M\" or some sort of code? But I'm going with what the text screams - a biological riddle, and the answer is the slime mold. Maybe the user just wanted a pretty picture and threw it in!\n",
            "\n",
            "The best answer is **Slime Mold**. I'll back that with the fact that its famous maze-solving behavior is a huge part of the solution.\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "OUTPUT:\n",
            "Based on the clues provided, you are thinking of a **Slime Mold** (specifically, *Physarum polycephalum*).\n",
            "\n",
            "Here is how it fits your description:\n",
            "*   **It moves, but doesn't walk, run, or swim:** Slime molds move by \"protoplasmic streaming,\" essentially oozing or flowing slowly across surfaces.\n",
            "*   **No fixed shape and can be cut:** It is an amorphous blob (a giant single cell with many nuclei). If you cut it in half, the pieces heal and continue to function independently as two new slime molds.\n",
            "*   **No brain but solves mazes:** This is the giveaway clue. Despite lacking a nervous system, slime molds are famous in the scientific community for their ability to find the most efficient path (shortest route) between food sources placed in a maze. They have even been used to model efficient railway networks.\n",
            "\n",
            "(Note: The billiard balls in the image display the odd number sequence 7, 9, 11, 13, but they are likely a distractor or separate puzzle, as they are solid, spherical, and definitely don't move on their own!)\n"
          ]
        }
      ],
      "source": [
        "prompt = \"\"\"\n",
        "  Find what I'm thinking of:\n",
        "    It moves, but doesn't walk, run, or swim.\n",
        "    It has no fixed shape and if cut into pieces, those pieces will keep living and moving.\n",
        "    It has no brain but can solve complex mazes.\n",
        "\"\"\"\n",
        "\n",
        "thinkingLevel = \"High\" # @param [\"Low\", \"High\"]\n",
        "\n",
        "data = {\n",
        "    \"contents\": [\n",
        "        {\n",
        "            \"parts\": [\n",
        "                {\"text\": prompt},\n",
        "                {\n",
        "                    \"inlineData\": {\n",
        "                        \"mimeType\": \"image/png\",\n",
        "                        \"data\": encoded_string\n",
        "                    }\n",
        "                }\n",
        "            ]\n",
        "        }\n",
        "    ],\n",
        "     \"generationConfig\": {\n",
        "          \"thinkingConfig\": {\n",
        "              \"includeThoughts\": True,\n",
        "              \"thinkingLevel\": thinkingLevel\n",
        "          }\n",
        "    }\n",
        "}\n",
        "\n",
        "response = requests.post(\n",
        "   url,\n",
        "   headers={'Content-Type': 'application/json'},\n",
        "   data=json.dumps(data)\n",
        ").json()\n",
        "\n",
        "print(\"THOUGHTS:\")\n",
        "print(response['candidates'][0]['content']['parts'][0]['text'])\n",
        "print()\n",
        "print(\"OUTPUT:\")\n",
        "print(response['candidates'][0]['content']['parts'][1]['text'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "b8hvmh_WlqV0"
      },
      "source": [
        "### Migrating from `thinkingBudget` to `thinkingLevel`\n",
        "\n",
        "With only high and low levels currently available, the migration should be quite simple:\n",
        "* If you were previously using **complex prompt engineering** (like Chain-of-thought) to force Gemini 2.5 to reason, go with `ThinkingLevel.HIGH`..\n",
        "* If you were using **dynamic thinking**, also go with `ThinkingLevel.HIGH`.\n",
        "* On the contrary if you were setting a low `thinkingBudget` or if **latency** is important, select `ThinkingLevel.LOW`.\n",
        "* If you are in doubt, keep the default value (`ThinkingLevel.HIGH`), as the dynamic thinking will scale the thinking depending on your use case.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lND4jB6MrsSk"
      },
      "source": [
        "# Next Steps\n",
        "\n",
        "Try Gemini 2.5 Pro Experimental in\n",
        "[Google AI Studio](https://aistudio.google.com/prompts/new_chat?model=gemini-2.5-pro-exp-03-25), and learn more about [Prompting for thinking models](https://ai.google.dev/gemini-api/docs/prompting-with-thinking).\n",
        "\n",
        "For more examples of the Gemini capabilities, check the other [Cookbook examples](https://github.com/google-gemini/cookbook). You'll learn how to use the [Live API](./Get_started.ipynb), juggle with [multiple tools](../examples/LiveAPI_plotting_and_mapping.ipynb) or use Gemini [spatial understanding](./Spatial_understanding.ipynb) abilities."
      ]
    }
  ],
  "metadata": {
    "colab": {
      "name": "Get_started_thinking_REST.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
